﻿using System;
using System.Collections.Generic;
using System.Data;
using ObjetoNegocio;

namespace Banco
{
    public class BuscaBD:BancoAbstrato<Busca>
    {

        public override bool Remover(Busca busca)
        {
            throw new System.NotImplementedException();
        }

        public override bool Atualizar(Busca busca)
        {
            throw new System.NotImplementedException();
        }

        public override Busca Pesquisar(Busca busca)
        {
            ComandoSql("[dbo].[cons_TBL_BuscaPorFiltro]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codigo", busca.Codigo);
            AdicionarParametroNulo("@dataCriacao", busca.Data);
            if (busca.Usuario != null)
            {
                AdicionarParametroNulo("@codUsuario", busca.Usuario.Codigo);
            }
            else
            {
                AdicionarParametroNulo("@codUsuario", busca.Usuario);
            }
            return ExecutarConsultaObjeto();
        }

        public override List<Busca> ListarPorFiltro(Busca busca)
        {
            ComandoSql("[dbo].[cons_TBL_BuscaPorFiltro]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codigo", busca.Codigo);
            AdicionarParametroNulo("@dataCriacao", busca.Data);
            if (busca.Usuario != null)
            {
                AdicionarParametroNulo("@codUsuario", busca.Usuario.Codigo);
            }else
            {
                AdicionarParametroNulo("@codUsuario", busca.Usuario);
            }
            return ExecutarConsultarListagem();
        }

        public override void Inserir(Busca busca)
        {
            decimal codigo;
            ComandoSql("[dbo].[ins_TBL_Busca]", CommandType.StoredProcedure);
            AdicionarParametro("@codigo", busca.Codigo, true);
            AdicionarParametro("@dataCriacao", busca.Data);
            AdicionarParametro("@codUsuario", busca.Usuario.Codigo);
            ExecutarComando(out codigo);
            busca.Codigo = codigo;

            busca.Atributos.ForEach(item => VincularBuscaUsuarioAtributo(busca,item,item.Valores));
        }
        
        public void VincularBuscaUsuarioAtributo(Busca busca,Atributo atributo,List<Valor> valores)
        {
            valores.ForEach(item => VincularBuscaUsuarioAtributoValor(busca,atributo,item));
        }
        
        public void VincularBuscaUsuarioAtributoValor(Busca busca,Atributo atributo,Valor valor)
        {
            ComandoSql("[dbo].[ins_TBL_Busca_Atributo]", CommandType.StoredProcedure);
            AdicionarParametro("@codBusca", busca.Codigo);
            AdicionarParametro("@codAtributo", atributo.Codigo);
            AdicionarParametro("@codValorAtributo", valor.Codigo);
            AdicionarParametro("@codUsuario", busca.Usuario.Codigo);
            ExecutarComando();
        }

        public override bool Existe(Busca busca)
        {
            throw new System.NotImplementedException();
        }

        protected override void MontarObjeto(ref Busca busca, IDataReader reader)
        {
           var usuarioBD = new UsuarioBD();
           var atributoBD = new AtributoBD();

            if (reader["CODIGO"] != DBNull.Value)
            {
                busca.Codigo = (decimal)reader["CODIGO"];
                busca.Usuario = usuarioBD.Pesquisar(new Usuario{Codigo = Convert.ToInt32(reader["CODIGO_USUARIO"])});
                busca.Atributos = atributoBD.ListarPorBusca(busca);
            }
            if (reader["DATA_CRIACAO"] != DBNull.Value)
            {
                busca.Data = Convert.ToDateTime(reader["DATA_CRIACAO"]);
            }
        }
    }
}
